# -*- coding: utf-8 -*-

# @Project : UI_DDTFrameWork
# @Author  : Mr.Deng
# @Time    : 2021/9/19 0:05

"""
键盘使用操作
"""

from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys as _Keys

from common.seleniumLibrary.base import Base
from common.tools.decorator import error_collection

# 键盘按键操作对应关键字
KDB = {
    "space": _Keys.SPACE, "enter": _Keys.ENTER,
    "back_space": _Keys.BACK_SPACE, "f5": _Keys.F5,
    "ctrl": _Keys.CONTROL
}


class Keys(Base):

    @error_collection
    def use_keys(self, keyName: str, elementPath: tuple = None):
        """
        使用键盘操作页面按钮等
        :param elementPath: 操作元素路径
        :param keyName: 使用键盘按键名称
        :return:
        """
        if keyName.lower() not in KDB.keys():
            raise NameError(f"输入键盘按钮名称不正确：{keyName} ，请检查KDB库中是否包含该字段！！！")
        try:
            if elementPath is None:
                ActionChains(self.driver).send_keys(KDB[keyName]).perform()
                self.Log.info(f"使用键盘：{keyName} 操作")
            else:
                self._find_element(elementPath).send_keys(KDB[keyName])
                self.Log.info(f"在页面元素: {elementPath} 上使用键盘: {keyName} 操作")
        except:
            raise Exception(f"使用键盘：{keyName} 操作页面按钮：{elementPath} 失败！！！")

    @error_collection
    def use_group_keys(self, keyName: str, groupKeys: str, elementPath: tuple = None):
        """
        组合键使用
        :param keyName: 主键名
        :param groupKeys: 组合键名
        :param elementPath: 元素路径
        :return:
        """
        if keyName.lower() not in KDB.keys():
            raise NameError(f"输入键盘按钮名称不正确：{keyName} ，请检查KDB库中是否包含该字段！！！")
        try:
            if elementPath is None:
                ActionChains(self.driver).key_down(KDB[keyName]).send_keys(groupKeys).perform()
                self.Log.info(f"使用键盘：{keyName} + {groupKeys} 操作")
            else:
                self._find_element(elementPath).send_keys(KDB[keyName], groupKeys)
                self.Log.info(f"在页面元素: {elementPath} 上使用键盘: {keyName} + {groupKeys} 操作")
        except:
            raise Exception(f"使用键盘：{keyName} 操作页面按钮：{elementPath} + {groupKeys} 失败！！！")
